// 包声明语句，用于组织和管理Java类
// com.itheima.staticmethod是包的路径，表示该类位于staticmethod包下
package com.itheima.staticmethod;

// 静态方法设计工具类
// 这是一个典型的工具类，只包含静态方法，用于提供验证码生成功能
public class VerifyCodeUtil {

    // 工具类没有创建对象的必要性，所以建议私有化构造器
    // private修饰符表示这个构造方法只能在当前类中访问
    // 私有化构造方法后，外部无法通过new关键字创建VerifyCodeUtil类的对象
    // 这是工具类的标准设计模式，因为工具类的功能都是通过静态方法直接调用的
    private VerifyCodeUtil() {}

    // 静态方法：用于生成指定长度的验证码
    // public：表示这个方法可以被外部调用
    // static：表示这是一个静态方法，可以直接通过类名调用，无需创建对象
    // String：返回值类型，表示方法返回一个字符串（即生成的验证码）
    // getCode：方法名
    // int n：方法参数，表示要生成的验证码位数
    public static String getCode(int n) {
        // 定义一个字符串变量用于记录生成的验证码
        // 初始值为空字符串，之后会逐步拼接验证码字符
        String code = "";
        
        // 循环n次，每次生成一个验证码字符并拼接到code中
        // 循环的作用是生成指定长度的验证码
        for (int i = 0; i < n; i++) {
            // i 表示当前正在生成的是第几个字符（从0开始计数）
            
            // 为当前位置随机生成一个字符类型：0表示数字，1表示大写字母，2表示小写字母
            // Math.random()生成一个[0.0, 1.0)之间的随机浮点数
            // Math.random() * 3 生成[0.0, 3.0)之间的随机浮点数
            // (int)强制转换为整数，结果为0、1或2
            int type = (int) (Math.random() * 3);  // [0,1) *3 => 0 1 2
            
            // 使用switch语句根据随机生成的类型来决定生成哪种字符
            switch (type) {
                case 0:
                    // 如果当前位置是数字类型（type=0）
                    // 生成一个0-9之间的随机数字
                    // Math.random() * 10 生成[0.0, 10.0)之间的随机浮点数
                    // (int)强制转换为整数，结果为0到9之间的整数
                    int num = (int) (Math.random() * 10);
                    
                    // 将生成的数字拼接到验证码字符串中
                    // 字符串拼接操作：code = code + num
                    code += num;
                    break;
                    
                case 1:
                    // 如果当前位置是大写字母类型（type=1）
                    // 生成一个0-25之间的随机数，用于表示A-Z中的某一个字母
                    int num1 = (int) (Math.random() * 26); // [0,25]
                    
                    // ASCII码中'A'的编码是65，'Z'的编码是90
                    // 65 + num1 计算出对应的大写字母的ASCII码
                    // (char)强制将整数转换为字符类型
                    char ch = (char) (65 + num1); // 得到大写字母的随机编号，转成大写字母
                    
                    // 将生成的大写字母拼接到验证码字符串中
                    code += ch;
                    break;
                    
                case 2:
                    // 如果当前位置是小写字母类型（type=2）
                    // 生成一个0-25之间的随机数，用于表示a-z中的某一个字母
                    int num2 = (int) (Math.random() * 26); // [0,25]
                    
                    // ASCII码中'a'的编码是97，'z'的编码是122
                    // 97 + num2 计算出对应的小写字母的ASCII码
                    // (char)强制将整数转换为字符类型
                    char ch1 = (char) (97 + num2);
                    
                    // 将生成的小写字母拼接到验证码字符串中
                    code += ch1;
                    break;
            }
        }
        
        // 返回生成的完整验证码字符串
        return code;
    }
}
